home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 021-030 / amok21 / popmenu / popmenu.def next >
Text File  |  1993-11-04  |  5KB  |  136 lines

  1. (*---------------------------------------------------------------------------
  2.     :Program.     PopMenu.def
  3.     :Contents.      Routinen, um ein simples Auswahlmenü beim Mauszeiger
  4.     :Contents.      erscheinen zu lassen.
  5.     :Author.      Bernd Preusing (aus C übersetzt, angepaßt und verfeinert)
  6.     :Address.      Gerhardstr. 16  D-2200 Elmshorn
  7.     :Phone.      04121/22486
  8.     :Copyright.      Public Domain
  9.     :Language.      Modula-2
  10.     :Translator.  M2Amiga V3.2e
  11.     :Support.      Helene (Lee) Taran (C-Programm Splines, Fish Disk #57)
  12.     :History.      V1.0 Preusing 26-Apr-89
  13.     :Bugs.      Nicht für GimmeZeroZero-Windows!
  14.     :Remark.      Great, Helene!
  15.     :Remark.      Das Original macht LockLayers auf irgendwas, nur nicht auf
  16.     :Remark.      die betroffenen Layer, dies ist korrigiert.
  17. ---------------------------------------------------------------------------*)
  18. DEFINITION MODULE PopMenu;
  19.  
  20. FROM SYSTEM    IMPORT    ADDRESS;
  21. FROM Graphics    IMPORT    RastPort, ClipRect, BitMap;
  22. FROM Exec    IMPORT    Byte;
  23. FROM Intuition    IMPORT    WindowPtr;
  24.  
  25. CONST
  26.     FONTHEIGHT = 8; (* uses topaz.8 *)
  27.     FONTWIDTH  = 8;
  28.     FONTBASELINE = 6;
  29.  
  30.     NOITEMSELECTED = 0; (* returned from PopUp if no item was selected *)
  31.     OUTSIDEWINDOW = -1; (* returned from PopUp if cursor outside of window *)
  32.  
  33. TYPE
  34.  
  35.     PopUpItemPtr = POINTER TO PopUpItem;
  36.     PopUpItem = RECORD
  37.           text: ADDRESS; (* text string to be displayed *)
  38.           selectionId,     (* id returned when this item is selected *)
  39.           left,
  40.           top,         (* top/left offset within menu *)
  41.           height,
  42.           width: INTEGER;(* desired height/width of selection box *)
  43.           color: Byte;     (* desired text color (=color register) *)
  44.           next: PopUpItemPtr (* link to next menu item *)
  45.         END;
  46.     PopUpMenu = RECORD
  47.           depth,        (* # of bitplanes to use *)
  48.           left,            (* used internally *)
  49.           top,
  50.           height,
  51.           width: INTEGER;    (* desired width of menu *)
  52.           deactivate: CARDINAL;    (* what MOUSEBUTTON deactivates menu *)
  53.           outlineColor,
  54.           areaColor: Byte;    (* color registers *)
  55.           cr: ClipRect;        (* clipping rectangle for display *)
  56.           rp: RastPort;        (* rastport for drawing into menu area*)
  57.           bitmap: BitMap;    (* actual bitmap for rendering menu *)
  58.           firstItem,        (* first in list of menu items *)
  59.           activeItem: PopUpItemPtr (* for internal use only! *)
  60.         END;
  61.  
  62.  
  63.  
  64. PROCEDURE StructPopUp(VAR Menu:PopUpMenu;
  65.               Depth:INTEGER;
  66.               oCol,
  67.               aCol:Byte);
  68. (* :Input.    Menu:   die zu initialisierende Struktur
  69.    :Input.    Depth:  die Tiefe des Screens, auf dem das Menü
  70.    :Input.        erscheinen soll
  71.    :Input.    oCol:   die Farbe der Umrahmung des Menüs
  72.    :Input.    aCol:   die Hintergrundfarbe des Menüs
  73.    :Semantic.    Die Menü-Struktur wird mit den gegebenen Werten
  74.    :Semantic.    initialisiert. Alle anderen Werte werden mit
  75.    :Semantic.    0 bzw. NIL vorbelegt.
  76.    :Semantic.    Menu.deactivate wird auf selectUp gesetzt, d.h.
  77.    :Semantic.    das Menü kann so nur mit der LINKEN Maustaste
  78.    :Semantic.    aufgerufen werden. Falls man die rechte Maustaste
  79.    :Semantic.    dafür benutzen möchte, muß deactivate auf menuUp
  80.    :Semantic.    geändert werden und in die window.flags muß
  81.    :Semantic.    rmbTrap.
  82. *)
  83.  
  84. PROCEDURE AddItem(VAR Menu:PopUpMenu;
  85.           VAR Item:PopUpItem;
  86.           Mtext:ADDRESS;
  87.           Id:INTEGER;
  88.           Color:Byte);
  89. (* :Input.    Menu: um das es hier geht
  90.    :Input.    Item: die PopUpItem-Struktur, die angehängt werden soll
  91.    :Input.    MText: die Adresse des Item-Textes
  92.    :Input.    Id: eine einmalige Nummer, die später von PopUp
  93.    :Input.        zurückgeliefert wird. Sollte >0 sein.
  94.    :Input.    Color: die Farbe des Textes
  95.    :Semantic.    Das Item wird initialisiert und an des Menü an-
  96.    :Semantic.    gehängt. Item.left wird auf 3, Item.top auf 1
  97.    :Semantic.    gesetzt; diese Werte garantieren einen 'sauberen'
  98.    :Semantic.    Menü-Aufbau, sie können aber für spezielle Effekte
  99.    :Semantic.    oder z.B. zur Zentrierung des Textes noch erhöht
  100.    :Semantic.    werden.
  101. *)
  102.  
  103. PROCEDURE InitPopUp(VAR Menu:PopUpMenu);
  104. (* :Input.    Menu: eben das
  105.    :Semantic.    Das Menü wird nun, nachdem alle Items angehängt
  106.    :Semantic.    sind, komplett strukturiert, ein RastPort wird
  107.    :Semantic.    aufgebaut und die Items und der Rahmen gezeichnet.
  108.    :Semantic.    Danach kann es durch PopUp benutzt werden.
  109. *)
  110.  
  111. PROCEDURE PopUp(VAR Menu:PopUpMenu;
  112.         window:WindowPtr):INTEGER;
  113. (* :Input.    Menu: das darzustellende Manü
  114.    :Input.    window: das Fenster, in dem es gezeigt werden soll
  115.    :Output.    die Id des ausgewählten Items oder NOITEMSELECTED
  116.    :Output.    oder OUTSIDEWINDOW
  117.    :Semantic.    Das Menü wird gezeigt, der Anwender kann mit der
  118.    :Semantic.    Maus auswählen und dann die entsprechende Maustaste
  119.    :Semantic.    wieder loslassen (normalerweise die linke, sonst
  120.    :Semantic.    Menu.deactivate ändern!) woraufhin das Menü wieder
  121.    :Semantic.    verschwindet und das id des gewählten Items
  122.    :Semantic.    zurückgeliefert wird.
  123.    :Note.    Das Menü wird im RastPort des Screen gezeigt, deshalb
  124.    :Note.    muß vom Programmierer darauf geachtet werden, daß
  125.    :Note.    es nicht größer als der Screen wird! Während der
  126.    :Note.    Darstellung sind alle Layer blockiert.
  127. *)
  128.  
  129. PROCEDURE DisposePopUp(VAR Menu:PopUpMenu);
  130. (* :Input.    Menu: das freizugebende Menü
  131.    :Semantic.    Der für das Menü durch InitPopUp belegte Speicher
  132.    :Semantic.    (BitPlanes) wird wieder freigegeben.
  133. *)
  134.  
  135. END PopMenu.def
  136.